package interview.a1b2c3;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-12-19 12:04
 **/

/**
 * 两个线程分别输出 A-Z 和 1-26 ，
 * 要求两个线程交替输出
 * 即：A1B2C3D4
 */
public class Test_02_AtomicInteger {
    public static final String[] LETTER_ARRAY = new String[]{"A", "B", "C", "D", "E", "F"};
    public static final String[] NUMBER_ARRAY = new String[]{"1", "2", "3", "4", "5", "6"};

    //    AtomicInteger 是原子操作，线程之间是可以同步的
    static AtomicInteger atomicInteger = new AtomicInteger(1);


    public static void main(String[] args) {
//        1、循环字母数组，atomicInteger首先等于1
        new Thread(() -> {
            for (String str : LETTER_ARRAY) {
//                2、初始值就是1 ，继续执行
//                9、值被数字线程修改为1 ，可以继续执行，
                while (atomicInteger.get() != 1) {
                }
//                3、输出第一个字母
                System.err.println(str);
//                4、atomicInteger 设置为2，第二次for循环，线程进入 while  循环
                atomicInteger.set(2);
            }
        }).start();

//        5、数字线程，atomicInteger 经过字母线程赋值后 = 2
        new Thread(() -> {
            for (String str : NUMBER_ARRAY) {
//                6、初始值就是1 ，不经过字母线程修改，则永远无法继续执行，被修改后可以继续执行
                while (atomicInteger.get() != 2) {
                }
//                7、输出第一个数字
                System.err.println(str);
//                8、修改值为1，当前线程的第二次for循环进入while，等待数字线程修改为 2
                atomicInteger.set(1);
            }
        }).start();
    }
}
